/* 
 * File:   DbConn.h
 * Author: batista
 *
 * Created on 20 de Fevereiro de 2013, 08:38
 */

#ifndef DBCONN_H
#define	DBCONN_H
#include <iostream>
#include <sqlite3.h>
#include <libpq-fe.h>
#include "ShowMsg.h"
#include "Card.h"
#include "Event.h"
#include "Ward.h"
#include "Room.h"
#include "DirFile.h"
#include "TimeUtil.h"
#include "DataConn.h"


using namespace std;
using std::string;

class DbConn : public DataConn {
public:
    DbConn(DirFile *dirfl, string host, string db, string port, string user, string pass);
    //
    virtual ~DbConn();

    DirFile* getDir() const {
        return dir;
    }

    void setDir(DirFile* dir) {
        this->dir = dir;
    }

    /**
     * Abre uma conexao com
     * o banco PostgreSql
     * @return true or false
     */
    bool openConnInPGree();

    /**
     * Fecha uma conexão 
     * aberta com o banco 
     * PostgreSql
     * @return 
     */
    void closeConnPGree();

    /**
     * Verifica se ha uma
     * conexao aberta com
     * o banco PostgreSql
     * @return true or false
     */
    bool isOpenConnPGree();


    /**
     * Executa uma query no 
     * PostGreeSql
     * @return true or false
     */
    bool runQueryInPGree(string query);

    /**
     * Metodo responsavel por
     * pegar o tempo programado
     * para o atendimento da 
     * chamada de paciente
     * @return 
     */
    long getTimeOutForAttend();

    /**
     * Metodo responsavel por pesquisar um evento
     * na base de dados e ver qual regra de negócio
     * aplicar.
     * @param nevent
     * @return 
     */
    Event* getTypeEventRldToApplyRule(Event *nevent);

    /**
     * Metodo responsavel por pesquisar um evento
     * na base de dados e ver qual regra de negócio
     * aplicar.
     * @param nevent
     * @return 
     */
    Card* getTypeCardEventToApplyRule(Card *ncard);


    /**
     * Abre uma conexao com
     * o banco Sqlite3
     * @return 
     */
    bool openConnInSqLite();

    /**
     * Verifica se ha uma 
     * conexao aberta com
     * o banco Sqlite3
     * @return 
     */
    bool isOpenConnSqLite();


    /**
     * Fecha uma conexao 
     * aberta com o banco
     * Sqlite3
     */
    void closeConnSqLite();


    /**
     * Metodo responsavel por retorna 
     * o ultimo id para coluna id.
     * de uma tabela.
     * @param table
     * @return Integer
     */
    int getLastIdFromTblSqLite(string table);


    /**
     * Adiciona um evento capturado da 
     * Rauland para a tabela na memoria do
     * Sqlite, tabela (event_rauland)
     * @return true or false
     */
    bool runAddEventInSqLite(Event *event);


    /**
     * Adiciona um evento capturado da 
     * Rauland para a tabela de eventos
     * para validacao de duplicidade de 
     * eventos na memoria do
     * Sqlite, tabela (event_cap)
     * @return true or false
     */
    bool runAddEventValidInSqLite(Event *event);

    /**
     * Atualiza um evento capturado da 
     * Rauland para a tabela event_cap
     * para validacao de duplicidade de 
     * eventos na memoria do Sqlite, 
     * tabela (event_cap)
     * @return true or false
     */
    bool runUpdateEventValidInSqLite(Event *event);

    /**
     * Metodo responsavel por validar se um evento
     * capturado er repetido para uma Ala e Quarto.
     * @param event
     * @return 
     */
    bool validEventCapRldInSqLite(Event *event);     
    
    
    /**
     * Metodo responsavel por adicionar um 
     * evento de cartao capturado para tabela
     * temporaria de cartoes no SqLite
     * @param card
     * @return 
     */
    bool runAddHexaCardInSqLite(Card *card);


    /**
     * Metodo responsavel por remover um evento
     * capturado da Rauland, previamente aplicada
     * a regra de negócio e atualizado no PostgreSQL.
     * @param nevent
     * @return 
     */
    bool runRemoveEventInSqLite(Event *nevent);


    /**
     * Metodo responsavel por remover um evento
     * Capturado do PDS200, previamente aplicada
     * a regra de negócio e atualizado no PostgreSQL.
     * @param ncard
     * @return 
     */
    bool runRemoveEventInSqLite(Card *ncard);
   

    /**
     * Metodo responsavel por pegar os eventos
     * disponiveis para que seja aplicada a regra de 
     * negocio. e adicionar em uma tabela no banco 
     * PostgreSQL.
     * @return 
     */
    vector<Event*> getEventToWorkFromSqLite();


    /**
     * Metodo responsavel por pegar os eventos de 
     * Cartoes disponiveis para que seja aplicada 
     * a regra de negocio. e adicionar em uma 
     * tabela no banco PostgreSQL.
     * @return 
     */
    vector<Card*> getCardToWorkFromSqLite();


    /**
     * Metodo responsavel por pegar codigo
     * e id para um evento capturado da 
     * Rauland.
     * @param event
     * @return 
     */
    Event* getEventIDToEventRldInSqLite(Event *event);

    /**
     * Metodo responsavel por pegar ward_id, ip_pds,
     * ward_code, short_name e ward_name
     * @param ward
     * @return 
     */
    Event* getWardIDToWardRldInSqLite(Event *event);

    /**
     * Metodo responsavel por pegar room_id,
     * para ward_id e room_name 
     * @param room
     * @return 
     */
    Event* getRoomIDToRoomRldInSqLite(Event *event);


    /**
     * Metodo responsavel por pegar o id para 
     * para o cartao capturado, caso esteja
     * cadastrados.
     * @param ncard
     * @return 
     */
    Card* getCardIDToCardInSqLite(Card *ncard);


    /**
     * Metodo responsavel por pegar a ala para 
     * o cartao capturado.
     * @param ncard
     * @return 
     */
    Card* getWardIDToWardCardInSqLite(Card *ncard);


    /**
     * Metodo responsavel por pegar o id do quarto
     * para o quarto capturado do cartao
     * @param ncard
     * @return 
     */
    Card* getRoomIDToRoomCardInSqLite(Card *ncard);


    /**
     * Metodo responsavel por pegar o id para um 
     * Evento de Atendimento Espontaneo. Que er gerado
     * quando nao for encontrado um evento para ser 
     * atendido ou finalizado.
     * @param ncard
     * @return 
     */
    Card* getEventIDToAEInPGree(Card *ncard);


    /**
     * Metodo responsavel por pesquisar
     * todos eventos em abertos para serem
     * testados e atendidos.
     * @return 
     */
    vector<Event*> getAllEventToApplyAssist(string query);

    /**
     * Metodo responsavel por pegar todas 
     * as alas 
     * @return vector<Wards>
     */
    vector<Ward*> getAllWards();


private:
    /**
     * Metodo responsavel por pegar todos 
     * os cartões
     * @return 
     */
    vector<Card*> getAllCards();

    /**
     * Metodo responsavel por pegar todos 
     * os eventos da Rauland.
     * @return vector<Event>
     */
    vector<Event*> getAllEvents();



    /**
     * Metodo responsavel por pegar
     * todos os quartos
     * @return vector<Rooms>
     */
    vector<Room*> getAllRooms();


    /**
     * Metodo responsavel por popular
     * as alas para a tabela de alas 
     * na memoria do Sqlite3
     * @return 
     */
    bool runPopWardToTblSqLite();


    /**
     * Metodo responsavel por popular 
     * os quartos para a tabela de quartos
     * na memoria do Sqlite3
     * @return 
     */
    bool runPopRoomToTblSqLite();


    /**
     * Metodo responsavel por popular
     * os Cartoes cadastrados para a 
     * tabela de cartoes na memoria do
     * Sqlite3
     * @return 
     */
    bool runPopCardToTblSqLite();


    /**
     * Metodo responsavel por popular 
     * os Eventos da Rauland para tabela
     * de eventos na memoria do Sqlite3 
     * @return 
     */
    bool runPopEventToTblSqLite();

    /**
     * Metodo responsavel por pegar todos 
     * os Quartos com Alas para os Eventos
     * Capturados.
     * @return vector<Rooms>
     */
    vector<Room*> getAllWardRoomsToEventCap();
    
    
    /**
     * Metodo responsavel por popular 
     * as alas e quartos para event_cap. 
     * Onde serao usados para comparar 
     * com os novos eventos que irao chegar. 
     * Assim evitando eventos duplicados. 
     * @return 
     */
    bool runAddWardRoomEventToCompareSqLite();    
    
    
    /**
     * Metodo responsavel por pegar o ID
     * e EVENT_NAME e IS_CANCEL para um evento capturado da 
     * Rauland.
     * @param event
     * @return 
     */
    Event* getEventIDToEventRldInPGree(Event *nevent);


    /**
     * Metodo responsavel por pegar ward_id, ip_pds
     * ward_code, short_name, e id para um evento 
     * capturado da Rauland.
     * @param event
     * @return 
     */
    Ward* getWardIDToWardRldInPGree(Event *nevent);


    /**
     * Metodo responsavel por pegar o id, ward_id
     * room_code, room_name e id para um evento 
     * capturado da Rauland.
     * @param event
     * @return 
     */
    Room* getRoomIDToRoomRldInPGree(Event *nevent);


    /**
     * Metodo responsavel por pegar o id, hexacard
     * para a tabela attendants no PostgreSQL, para 
     * atualizar a tabela local e o evento atual.
     * @param ncard
     * @return 
     */
    Card* getCardIDToCardInPGree(Card *ncard);


    /**
     * Metodo responsavel por adicionar um evento
     * pesquisado para o evento rauland na tabela
     * de table_events na memoria.
     * @param nevent
     * @return 
     */
    bool AddEventToTblEventsInSqLite(Event *nevent);


    /**
     * Metodo responsavel por adicionar uma ala
     * pesquisada para o evento rauland na tabela
     * de alas na memoria.
     * @param nward
     * @return 
     */
    bool AddWardToTblWardsInSqLite(Ward *nward);

    /**
     * Metodo responsavel por adicionar um quarto
     * pesquisado para o evento rauland na tabela
     * de quatos na memoria.
     * @param nroom
     * @return 
     */
    bool AddRoomToTblRoomsInSqLite(Room *nroom);


    /**
     * Metodo responsavel por adicionar um novo cartao
     * para tabela local no SqLite
     * @param ncard
     * @return 
     */
    bool AddCardToTblAttendantInSqLite(Card *ncard);


private:
    bool status_readconf;
    sqlite3 *dbSqLite;
    PGconn *conn;
    PGresult *rs;
    //
    ShowMsg *msg;
    DirFile *dir;
    Event *evrld;
    Card *evcard;
    Ward *ward;
    Room *room;
    TimeUtil *tmut;
};

#endif	/* DBCONN_H */

